package cn.hg.solon.plugin.activerecord.demo.blog;

import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.ModelAndView;
import org.noear.solon.validation.annotation.NotEmpty;
import org.noear.solon.validation.annotation.Validated;

import cn.hg.solon.plugin.activerecord.demo.common.BaseController;
import cn.hg.solon.plugin.activerecord.demo.common.model.Blog;
import cn.hg.solon.plugin.activerecord.demo.common.service.BlogService;

/**
 * 本 Demo 改造自 JFinal 的 Demo。
 * 
 * 所有 sql 与业务逻辑写在 Service 中，不要放在 Model 中，更不
 * 要放在 Controller 中，养成好习惯，有利于大型项目的开发与维护
 */
@Controller
@Mapping("/blog")
public class BlogController extends BaseController {

    @Inject
    BlogService blogService;

    @Mapping("/add")
    public ModelAndView add(Context ctx) {
        return new ModelAndView("/blog/add.html");
    }

    @Mapping("/delete/{id}")
    public void delete(Context ctx, Integer id) {
        this.blogService.deleteById(id);
        ctx.redirect("/blog");
    }

    @Mapping("/edit/{id}")
    public ModelAndView edit(Context ctx, Integer id) {
        ModelAndView mav = new ModelAndView("/blog/edit.html");
        mav.put("blog", this.blogService.findById(id));
        return mav;
    }

    @Mapping
    public ModelAndView index(Context ctx) {
        return this.index(ctx, 1);
    }

    @Mapping("/{pageNumber}")
    public ModelAndView index(Context ctx, Integer pageNumber) {
        ModelAndView mav= new ModelAndView("/blog/blog.html");
        mav.put("blogPage", this.blogService.paginate(pageNumber, 10));
        return mav;
    }

    /**
     * save 与 update 的业务逻辑在实际应用中也应该放在 serivce 之中，
     * 并要对数据进正确性进行验证，在此仅为了偷懒
     */
    @NotEmpty({"title", "content"})
    @Mapping("/save")
    public void save(Context ctx, @Validated Blog blog) {
        this.blogService.save(blog);
        ctx.redirect("/blog");
    }

    /**
     * save 与 update 的业务逻辑在实际应用中也应该放在 serivce 之中，
     * 并要对数据进正确性进行验证，在此仅为了偷懒
     */
    @NotEmpty({"id", "title", "content"})
    @Mapping("/update")
    public void update(Context ctx, @Validated Blog blog) {
        this.blogService.update(blog);
        ctx.redirect("/blog");
    }
}
